/**
 * 认证相关工具函数
 */
import { useUserStore } from '@/stores/user'

// Token存储键名
const TOKEN_KEY = 'user_token'

/**
 * 获取Token
 */
export const getToken = (): string | null => {
  return localStorage.getItem(TOKEN_KEY)
}

/**
 * 检查用户是否已登录
 */
export const isAuthenticated = (): boolean => {
  const userStore = useUserStore()
  return userStore.isLoggedIn
}

/**
 * 获取当前用户ID
 */
export const getCurrentUserId = (): number | undefined => {
  const userStore = useUserStore()
  return userStore.userId
}

/**
 * 获取当前用户信息
 */
export const getCurrentUser = () => {
  const userStore = useUserStore()
  return userStore.userInfo
}

/**
 * 检查用户权限
 * @param permission 权限标识
 */
export const hasPermission = (permission: string): boolean => {
  // 这里可以根据实际需求实现权限检查逻辑
  // 目前简单返回是否已登录
  return isAuthenticated()
}

/**
 * 需要登录的路由守卫
 */
export const requireAuth = () => {
  if (!isAuthenticated()) {
    // 可以在这里处理未登录的逻辑，比如跳转到登录页
    return false
  }
  return true
}

/**
 * 格式化用户显示名称
 */
export const formatUserDisplayName = (user?: { nickname?: string; username?: string }): string => {
  if (!user) return '未知用户'
  return user.nickname || user.username || '未知用户'
}

/**
 * 获取用户头像URL
 */
export const getUserAvatarUrl = (avatar?: string): string => {
  if (!avatar) {
    // 返回默认头像
    return '/placeholder-avatar.svg'
  }
  
  // 如果是完整URL，直接返回
  if (avatar.startsWith('http')) {
    return avatar
  }
  
  // 如果是相对路径，拼接基础URL
  // 这里需要根据实际的图片服务配置
  return avatar
}

/**
 * 生成用户头像占位符
 */
export const generateAvatarPlaceholder = (name: string): string => {
  // 取用户名的第一个字符作为头像占位符
  return name.charAt(0).toUpperCase()
}

/**
 * 格式化性别显示
 */
export const formatGender = (gender?: number): string => {
  switch (gender) {
    case 1:
      return '男'
    case 2:
      return '女'
    default:
      return '未知'
  }
}

/**
 * 格式化用户状态
 */
export const formatUserStatus = (status?: number): string => {
  switch (status) {
    case 1:
      return '正常'
    case 0:
      return '禁用'
    default:
      return '未知'
  }
}

/**
 * 检查是否为有效的邮箱格式
 */
export const isValidEmail = (email: string): boolean => {
  const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/
  return emailRegex.test(email)
}

/**
 * 检查是否为有效的手机号格式
 */
export const isValidMobile = (mobile: string): boolean => {
  const mobileRegex = /^1[3-9]\d{9}$/
  return mobileRegex.test(mobile)
}

/**
 * 检查是否为有效的用户名格式
 */
export const isValidUsername = (username: string): boolean => {
  // 用户名必须以字母开头，可包含字母、数字、下划线，长度3-16位
  const usernameRegex = /^[a-zA-Z][a-zA-Z0-9_]{2,15}$/
  return usernameRegex.test(username)
}

/**
 * 检查是否为有效的密码格式
 */
export const isValidPassword = (password: string): boolean => {
  // 密码长度6-32位，不能包含特殊字符 &<>"'\n\r
  const passwordRegex = /^(?!.*[&<>"'\n\r]).{6,32}$/
  return passwordRegex.test(password)
}

/**
 * 生成随机字符串（用于验证码ID等）
 */
export const generateRandomString = (length: number = 32): string => {
  const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
  let result = ''
  for (let i = 0; i < length; i++) {
    result += chars.charAt(Math.floor(Math.random() * chars.length))
  }
  return result
}

/**
 * 格式化时间戳为可读格式
 */
export const formatTimestamp = (timestamp: number): string => {
  const date = new Date(timestamp * 1000)
  return date.toLocaleString('zh-CN')
}

/**
 * 计算密码强度
 */
export const calculatePasswordStrength = (password: string): {
  score: number
  level: 'weak' | 'medium' | 'strong'
  suggestions: string[]
} => {
  let score = 0
  const suggestions: string[] = []
  
  // 长度检查
  if (password.length >= 8) {
    score += 1
  } else {
    suggestions.push('密码长度至少8位')
  }
  
  // 包含小写字母
  if (/[a-z]/.test(password)) {
    score += 1
  } else {
    suggestions.push('包含小写字母')
  }
  
  // 包含大写字母
  if (/[A-Z]/.test(password)) {
    score += 1
  } else {
    suggestions.push('包含大写字母')
  }
  
  // 包含数字
  if (/\d/.test(password)) {
    score += 1
  } else {
    suggestions.push('包含数字')
  }
  
  // 包含特殊字符（但排除不允许的字符）
  if (/[!@#$%^*()_+\-=\[\]{};':"|,.<>?~`]/.test(password)) {
    score += 1
  } else {
    suggestions.push('包含特殊字符')
  }
  
  let level: 'weak' | 'medium' | 'strong'
  if (score <= 2) {
    level = 'weak'
  } else if (score <= 3) {
    level = 'medium'
  } else {
    level = 'strong'
  }
  
  return { score, level, suggestions }
}
